package com.taobao.taokeeper.monitor.web;

import com.taobao.taokeeper.common.GlobalInstance;
import com.taobao.taokeeper.model.ZooKeeperCluster;
import com.taobao.taokeeper.model.ZooKeeperStatusV2;
import common.toolkit.java.exception.DaoException;
import common.toolkit.java.util.StringUtil;
import common.toolkit.java.util.io.ServletUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static common.toolkit.java.constant.EmptyObjectConstant.EMPTY_STRING;
import static common.toolkit.java.constant.SymbolConstant.COLON;

/**
 * Control of ZooKeeperStatus
 *
 * @author yinshi.nc@taobao.com
 * @since 2011-08-10
 */
@Controller
@RequestMapping("/zooKeeperStatus.do")
public class ZooKeeperStatusController extends BaseController {

    private static final Logger LOG = LoggerFactory.getLogger(ZooKeeperStatusController.class);

    @RequestMapping(params = "method=showZooKeeperStatusPAGE")
    public ModelAndView showZooKeeperStatusPAGE(HttpServletRequest request, HttpServletResponse response, String clusterId) throws IOException {

        try {
            clusterId = StringUtil.defaultIfBlank(clusterId, 1 + EMPTY_STRING);

            ZooKeeperCluster zooKeeperCluster = GlobalInstance.getZooKeeperClusterByClusterId(Integer.parseInt(clusterId));
            Map<Integer, ZooKeeperCluster> zooKeeperClusterMap = GlobalInstance.getAllZooKeeperCluster();
            if (null == zooKeeperCluster) {
                zooKeeperCluster = zooKeeperClusterDAO.getZooKeeperClusterByCulsterId(Integer.parseInt(clusterId));
            }

            if (null == zooKeeperCluster) {
                ServletUtil.writeToResponse(response, "目前还没有这样的ZK集群<a href='zooKeeper.do?method=zooKeeperRegisterPAGE'><font color='red'> 加入监控</font></a>");
                return null;
            }

            Map<String, ZooKeeperStatusV2> zooKeeperStatusMap = new HashMap<String, ZooKeeperStatusV2>();

            //进行系统数据采集
            List<String> serverList = zooKeeperCluster.getServerList();
            if (null != serverList) {
                for (String server : serverList) {
                    String ip = StringUtil.trimToEmpty(server.split(COLON)[0]);
                    //获取自检状态
                    int statusType = GlobalInstance.getZooKeeperStatusType(ip);
                    ZooKeeperStatusV2 zooKeeperStatus = GlobalInstance.getZooKeeperStatus(ip);
                    if (null != zooKeeperStatus) {
                        zooKeeperStatus.setStatusType(statusType);
                    } else {
                        zooKeeperStatus = new ZooKeeperStatusV2();
                        zooKeeperStatus.setStatusType(statusType);
                    }
                    zooKeeperStatusMap.put(ip, zooKeeperStatus);
                }
            }

            Map<String, Object> model = new HashMap<String, Object>();
            model.put("zooKeeperStatusMap", zooKeeperStatusMap);
            model.put("clusterId", zooKeeperCluster.getClusterId());
            model.put("clusterName", zooKeeperCluster.getClusterName());
            model.put("description", zooKeeperCluster.getDescription());
            model.put("zooKeeperClusterMap", zooKeeperClusterMap);
            model.put("timeOfUpdateZooKeeperStatusSet", GlobalInstance.timeOfUpdateZooKeeperStatusSet);
            //model.put("clusterRTStatsMap", ZooKeeperRTCollectJob.getRtStatus().get(zooKeeperCluster.getClusterId()));
            //model.put("clusterRTStats", ZooKeeperRTCollectJob.getClustRTStatus().get(zooKeeperCluster.getClusterId()));
            return new ModelAndView("monitor/zooKeeperStatusPAGE", model);

        } catch (NumberFormatException e) {
            LOG.error("不合法的clusterId：" + clusterId);
            ServletUtil.writeToResponse(response, "不合法的clusterId：" + clusterId);
            e.printStackTrace();
        } catch (DaoException e) {
            LOG.error("Error when handle db: " + e.getMessage());
            ServletUtil.writeToResponse(response, "Error when handle db: " + e.getMessage());
            e.printStackTrace();
        } catch (Exception e) {
            LOG.error("Server error : " + e.getMessage());
            ServletUtil.writeToResponse(response, "Server error: " + e.getMessage());
            e.printStackTrace();
        }

        return null;
    }


}
